/*******************************************************************************
* Copyright (c) 2013 VMware, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.boot.wizard.github.auth;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLConnection;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.commons.codec.binary.Base64;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.ide.eclipse.boot.wizard.BootWizardActivator;
import org.springframework.web.client.RestTemplate;
/**
* Uses basic authentication username and passwd to access github rest api.
*
* @author Kris De Volder
*/
public class BasicAuthCredentials extends Credentials {
private final Pattern host;
private final String username;
private final String passwd;
public BasicAuthCredentials(Pattern host, String username, String passwd) {
this.host = host;
this.username = username;
this.passwd = passwd;
}
@Override
public String toString() {
return "BasicAuthCredentials("+username+")";
}
private String computeAuthString() throws UnsupportedEncodingException {
String authorisation = username + ":" + passwd;
byte[] encodedAuthorisation = Base64.encodeBase64(authorisation.getBytes("utf8"));
String authString = "Basic " + new String(encodedAuthorisation);
return authString;
}
@Override
public RestTemplate apply(RestTemplate rest) {
List<ClientHttpRequestInterceptor> interceptors = rest.getInterceptors();
interceptors.add(new ClientHttpRequestInterceptor() {
public ClientHttpResponse intercept(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution) throws IOException {
if (matchHost(request.getURI().getHost())) {
HttpHeaders headers = request.getHeaders();
if (!headers.containsKey("Authorization")) {
String authString = computeAuthString();
headers.add("Authorization", authString);
}
}
return execution.execute(request, body);
}
});
return rest;
}
@Override
public void apply(URLConnection conn) {
try {
if (matchHost(conn.getURL().getHost())) {
conn.setRequestProperty("Authorization", computeAuthString());
}
} catch (UnsupportedEncodingException e) {
//Shouldn't really be possible...
BootWizardActivator.log(e);
}
}
private boolean matchHost(String host) {
if (this.host!=null) {
return this.host.matcher(host).matches();
} else {
return true;
}
}
}